#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
主题: 字符串匹配和搜索
问题: 你想匹配或者搜索特定模式的文本
提示 :
"""

import re
from calendar import month_abbr

# 替换模式
replacemode = r'\3-\1-\2'

def recipe1():
    # 简单的字面模式，直接使用 str.replace() 方法
    text1 = 'yeah, but no, but yeah, but no, but yeah'
    print(f"{text1 = }")
    print(f"{text1.replace('yeah', 'yep') = }")

    # 复杂的模式，请使用 re 模块中的 sub() 函数
    text2 = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    print(f"{text2 = }")
    # sub() 函数中的第一个参数是被匹配的模式，第二个参数是替换模式
    print(re.sub(r'(\d+)/(\d+)/(\d+)', replacemode, text2))

    # 相同的模式做多次替换，考虑先编译它来提升性能
    datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
    print(f"{datepat.sub(replacemode, text1) = }")

    # 命名分组
    print(re.sub(r'(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)', r'\g<year>-\g<month>-\g<day>', text1))

    # 更加复杂的替换，可以传递一个替换回调函数来代替
    print(f"{datepat.sub(change_date, text1) = }")

    # 有多少替换发生了，可以使用 re.subn() 来代替
    newtext, n = datepat.subn(replacemode, text1)
    print(f"{newtext = }")
    print(f"{n = }")

def change_date(m):
    mon_name = month_abbr[int(m.group(1))]
    return '{} {} {}'.format(m.group(2), mon_name, m.group(3))

def main():
    print('recipe1'.center(20, '*'))
    recipe1()


if __name__ == '__main__':
    main()    